<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 1. 编写一个函数，计算两个数字的和差积商
      function fn1(a, b, operator = "+") {
        switch (operator) {
          case "+":
            return a + b;
          // break;
          case "-":
            return a - b;
          // break;
          case "*":
            return a * b;
          // break;
          case "/":
            return a / b;
          // break;

          default:
            return "更多功能开发中";
        }
      }

      /* 打印函数执行的结果 就是在打印函数的返回值 */
      //   console.log(fn1(2, 3)); //5
      //   console.log(fn1(2, 3, "-")); //-1
      //   console.log(fn1(2, 3, "*")); //6
      //   console.log(fn1(2, 3, "/")); //0.66666
      //   console.log(fn1(2, 3, "%")); //更多功能

      // 2. 编写函数，求圆的面积
      function getCircleArea(radius) {
        //   return Math.PI * radius * radius
        return Math.PI * Math.pow(radius, 2);
      }
      //   var area = getCircleArea(2)
      //   console.log("半径为%s的圆面积为%s",2,area);
      //   console.log("半径为%s的圆面积为%s",2,getCircleArea(2));
      //   console.log("半径为%s的圆面积为%s",2,getCircleArea(2).toFixed(2));

      // 3. 编写函数，判断一个字符串的内容是不是纯数字
      /* 
      NaN 不全等 NaN
      判断一个值是不是NaN 使用isNaN(value) 如果value是NaN则返回true 否则false
      */
      function isNumberStr(str) {
        //0 NaN 正常数值
        // var temp = Number(str);
        // console.log(str,temp);

        /* 不OK */
        // var temp = Number(str);
        // switch (temp) {
        //   case 0:
        //     return true;
        //   //NaN === NaN 结果是false
        //   case NaN:
        //     return false;
        //   default:
        //     return true;
        // }

        /* OK */
        // var temp = Number(str);
        // switch (true) {
        //   // str为"0"
        //   case temp === 0:
        //     return true;

        //   // str为非数字
        //   //NaN === NaN 结果是false
        //   case isNaN(temp):
        //     return false;

        //   // str为纯数字
        //   default:
        //     return true;
        // }

        /* OK */
        // var temp = Number(str);
        // if (temp === 0) {
        //   return true;
        // } else if (isNaN(temp)) {
        //   return false;
        // } else {
        //   return true;
        // }

        // 只要str转Number不为NaN 结果即为true
        return !isNaN(Number(str));
      }
      //   console.log("0", isNumberStr("0")); //true
      //   console.log("班长是个帅比", isNumberStr("班长是个帅比")); //false
      //   console.log("123", isNumberStr("123")); //true
      //   console.log("-123", isNumberStr("-123")); //true

      // 4. 编写一个函数，计算三个数字的大小，按从小到大的顺序输出
      function sort(a, b, c) {
        // switch (true) {
        //   //   a最小
        //   case a <= b && b <= c:
        //     console.log(a, b, c);
        //     break;
        //   case a <= c && c <= b:
        //     console.log(a, c, b);
        //     break;

        //   //   b最小
        //   case b <= a && a <= c:
        //     console.log(b, a, c);
        //     break;
        //   case b <= c && c <= a:
        //     console.log(b, c, a);
        //     break;

        //   //   c最小
        //   case c <= a && a <= b:
        //     console.log(c, a, b);
        //     break;
        //   case c <= b && b <= a:
        //     console.log(c, b, a);
        //     break;

        //   default:
        //     console.log(
        //       "代码执行到此处可以到班长处领取红包一个+新式打劫装备一个"
        //     );
        //     break;
        // }

        /* OK */
        // if (a <= b && a <= c) {
        //   b <= c ? console.log(a, b, c) : console.log(a, c, b);
        // } else if (b <= a && b <= c) {
        //   a <= c ? console.log(b, a, c) : console.log(b, c, a);
        // } else {
        //   a <= b ? console.log(c, a, b) : console.log(c, b, a);
        // }

        if (a <= b && a <= c) {
          b <= c ? console.log(a, b, c) : console.log(a, c, b);
        }

        if (b <= a && b <= c) {
          a <= c ? console.log(b, a, c) : console.log(b, c, a);
        }

        if (c <= a && c <= b) {
          a <= b ? console.log(c, a, b) : console.log(c, b, a);
        }
      }
      //   sort(3, 4, 5);
      //   sort(3, 5, 4);
      //   sort(4, 5, 3);
      //   sort(4, 3, 5);
      //   sort(5, 4, 3);
      //   sort(5, 3, 4);

      // 5. 编写一个函数，在页面上输出一个N行M列的表格，表格内容填充0~100的随机数字
      function createTable(n, m) {
        //   输出表头
        document.write("<table border='1'>");

        /* 外层循环N次 */
        for (var i = 0; i < n; i++) {
          // 行头
          document.write("<tr>");

          // 输出m列
          for (var j = 0; j <= m; j++) {
            //   猎头 + 随机数 + 列尾
            document.write("<td>" + parseInt(Math.random() * 100) + "</td>");
          }

          // 行尾
          document.write("</tr>");
        }

        //   输出表尾
        document.write("</table>");
      }
      //   createTable(3, 4);

      // 6. 编写一个函数，生成4位数字的验证码
      function createIdcode(n = 4) {
        var idcode = "";
        for (var i = 0; i < n; i++) {
          idcode += parseInt(Math.random() * 10);
        }
        return idcode;
      }
      //   console.log(createIdcode(6));

      // 7. 求m-n之间数字的和
      function getSum(m, n) {
        var sum = 0;
        for (var i = m; i <= n; i++) {
          sum += i;
        }
        return sum;
      }
      //   console.log(
      //     getSum(51, 100)
      //   );

      // ----------
      // 8. 编写函数digit(num, k)，函数功能是：求整数num从右边开始的第k位数字的值，如果num位数不足k位则返回0。
      // 0.000000001234567
      function digit(num, k) {
        // 1234567 除以100=> 12345.67 取整=> 12345 模10=> 5
        //   相求倒数第K位 则num至少应为Math.pow(10,k-1)
        // if(num >= Math.pow(10, k - 1)){
        //     return parseInt(num / Math.pow(10,k-1))%10
        // }else{
        //     // 长度不够 直接返回0
        //     return 0
        // }

        // return num >= Math.pow(10, k - 1)
        //   ? parseInt(num / Math.pow(10, k - 1)) % 10
        //   : 0;

        // 先将num转换为字符串 然后通过str.length求得字符串的长度
        // 长度不够直接返回0
        return k > (num + "").length
          ? parseInt(num / Math.pow(10, k - 1)) % 10
          : 0;

      }

      //   for (var i = 1; i <= 20; i++) {
      //     console.log(i, digit(1234567, i));
      //   }

      // 9. 编写函数计算一个数字的长度
      //   function getNumberLength(n) {
      //     //   return (n+"").length

      //     var length = 0;
      //     while (n >= 1) {
      //       n /= 10;
      //       length++;
      //     }
      //     return length;
      //   }

      function getNumberLength(n) {
        if (n === 0) return 1;

        var length = 1;
        while (true) {
          if (n >= Math.pow(10, length - 1) && n < Math.pow(10, length)) {
            return length;
          }
          length++;
        }
      }
      //   console.log(getNumberLength(123));
      //   console.log(getNumberLength(1234));
      //   console.log(getNumberLength(12345));

      // 10. 编写一个函数，计算任意两个数字之间所能组成的奇数个数，数字必须是个位数。比如：计算0~3之间能组成的奇数是： 01、03、11、13、21、23、31、33
      function fn2(start, end) {
        for (var i = start; i <= end; i++) {
          if (i % 2 === 1) {
            //   跟班长的所有同党都跳一支舞
            for (var j = start; j <= end; j++) {
              console.log(j + "" + i);
            }
          }
        }
      }
      //   fn2(0, 3);

      // 11. 某个公司采用公用电话传递数据，数据是四位的整数，在传递过程中是加密的，加密规则如下：
      // 每位数字都加上5,
      //然后用除以10的余数代替该数字
      //再将第一位和第四位交换
      //第二位和第三位交换
      //请编写一个函数，传入原文，输出密文
      // 7943 12,14,9,8 2498    8942
      function createSecret(n) {
        //   分离出千位、百位、十位、个位
        var qw = parseInt(n / 1000);
        var bw = parseInt((n % 1000) / 100);
        var sw = parseInt((n % 100) / 10);
        var gw = n % 10;
        console.log(qw, bw, sw, gw);

        // 每位数字都加上5,
        qw += 5;
        bw += 5;
        sw += 5;
        gw += 5;

        //然后用除以10的余数代替该数字
        qw %= 10;
        bw %= 10;
        sw %= 10;
        gw %= 10;

        //再将第一位和第四位交换
        //第二位和第三位交换

        return gw * 1000 + sw * 100 + bw * 10 + qw;
      }

      function getSourceCode(n) {
        //   分离出千位、百位、十位、个位
        var qw = parseInt(n / 1000);
        var bw = parseInt((n % 1000) / 100);
        var sw = parseInt((n % 100) / 10);
        var gw = n % 10;
        // console.log(qw, bw, sw, gw);

        var temp;
        //再将第一位和第四位交换
        temp = qw;
        qw = gw;
        gw = temp;

        //第二位和第三位交换
        temp = bw;
        bw = sw;
        sw = temp;

        // 退回N+5
        qw < 5 && (qw += 10);
        bw < 5 && (bw += 10);
        sw < 5 && (sw += 10);
        gw < 5 && (gw += 10);
        // console.log(qw, bw, sw, gw); //2498

        // 各自减去5
        qw -= 5;
        bw -= 5;
        sw -= 5;
        gw -= 5;

        return qw * 1000 + bw * 100 + sw * 10 + gw;
      }
      //   console.log(getSourceCode(8341));
      //   console.log(getSourceCode(6983));

      // 12. 编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,当输入n为奇数时，调用函数求1/1+1/3+...+1/n
      function fn3(n) {
        var expression = "";

        // if (n % 2 === 0) {
        //   for (var i = 2; i <= n; i += 2) {
        //     expression += "+1/" + i;
        //   }
        // } else {
        //   for (var i = 1; i <= n; i += 2) {
        //     expression += "+1/" + i;
        //   }
        // }

        for (var i = n % 2 === 0 ? 2 : 1; i <= n; i += 2) {
          expression += "+1/" + i;
        }

        console.log(expression);
      }
      //   fn3(17);
      //   fn3(18);

      // 13. 使用函数完成任意数字阶乘的计算
      // 14. 要求：页面输入任意数字，点击按钮后计算该数字的阶乘
      function getJiecheng(n) {
        var jc = 1;
        for (var i = 1; i <= n; i++) {
          jc *= i;
        }
        return jc;
      }
    </script>

    <input type="text" placeholder="请输入一个正整数" id="ip" />
    <button id="btn">求阶乘</button>
    <hr />
    <span id="sp">innerText</span>

    <!-- 后面的脚本可以使用前面的脚本定义的变量和函数 -->
    <script>
      btn.onclick = function () {
        // var result = getJiecheng(ip.value * 1);
        // sp.innerText = result;
        sp.innerText = getJiecheng(ip.value * 1);
      };
    </script>
  </body>
</html>
